package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraResponsableDAO;
import mx.ipn.persistencia.dao.EmpleadoDAO;
import mx.ipn.to.BitacoraResponsableTO;
import mx.ipn.to.EmpleadoTO;
import mx.ipn.to.FechaHoraTO;

public class BitacoraResponsableDAOMySQL implements BitacoraResponsableDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(BitacoraResponsableDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO bitacora_responsable(id_responsable,id_empleado_jefe,id_empleado_subordinado,activo,fecha) VALUES(?,?,?,?,?)";
	
	private static final String FINDBYID = "SELECT * FROM bitacora_responsable WHERE id_operacion=?";
	
	private static final String SELECT = "SELECT * FROM bitacora_responsable";
	private static final String SELECTBYIDRESPONSABLE = "SELECT * FROM bitacora_responsable WHERE id_responsable=?";
	private static final String SELECTBYRANGOFECHA = "SELECT * FROM bitacora_responsable WHERE fecha>=? AND fecha<=?";
	
	private static final String SELECTBYJEFE = "SELECT * FROM bitacora_responsable WHERE id_empleado_jefe=?";
	private static final String SELECTBYSUBORDINADO = "SELECT * FROM bitacora_responsable WHERE id_empleado_subordinado=?";

	@Override
	public BitacoraResponsableTO findBitacoraResponsableById(
			int idBitacoraResponsable) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);
			ps.setInt(1, idBitacoraResponsable);
			ResultSet rs = ps.executeQuery();

			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			if (rs.next()) {
				ArrayList<EmpleadoTO> listEmpleadoJefeTO = new ArrayList<EmpleadoTO>();
				ArrayList<EmpleadoTO> listEmpleadoSubordinadoTO = new ArrayList<EmpleadoTO>();

				int idResponsable = rs.getInt("id_responsable");
				EmpleadoTO empleadoJefeTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado_jefe"));
				EmpleadoTO empleadoSubordinadoTO = empleadoDAO
						.findEmpleadoById(rs.getInt("id_empleado_subordinado"));
				listEmpleadoJefeTO.add(empleadoJefeTO);
				listEmpleadoSubordinadoTO.add(empleadoSubordinadoTO);
				boolean activo = rs.getBoolean("activo");
				java.sql.Date fecha = rs.getDate("fecha");

				EmpleadoTO[] arrEmpleadoJefeTO = (EmpleadoTO[])listEmpleadoJefeTO.toArray(new EmpleadoTO[listEmpleadoJefeTO.size()]);
				EmpleadoTO[] arrEmpleadoSubordinadoTO = (EmpleadoTO[])listEmpleadoSubordinadoTO.toArray(new EmpleadoTO[listEmpleadoSubordinadoTO.size()]);
				
				BitacoraResponsableTO bitacoraResponsableTO = new BitacoraResponsableTO(
						idBitacoraResponsable, idResponsable,
						arrEmpleadoJefeTO, arrEmpleadoSubordinadoTO, activo,
						fecha);

				ps.close();
				conexion.close();
				return bitacoraResponsableTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertBitacoraResponsable(
			BitacoraResponsableTO bitacoraResponsableTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);
			ps.setInt(1, bitacoraResponsableTO.getIdResponsable());
			ps.setInt(2, bitacoraResponsableTO.getIdEmpleadoJefe());
			ps.setInt(3, bitacoraResponsableTO.getIdEmpleadoSubordinado());
			ps.setBoolean(4, bitacoraResponsableTO.getActivo());
			ps.setDate(5, FechaHoraTO.getFecha(bitacoraResponsableTO.getFecha()));

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<BitacoraResponsableTO> selectBitacoraResponsable() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			EmpleadoDAO empleadoDAO = null;

			ArrayList<BitacoraResponsableTO> bitacoraResponsableTO = null;
			BitacoraResponsableTO bitacoraResponsableTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraResponsableTO == null) {
					bitacoraResponsableTO = new ArrayList<BitacoraResponsableTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				ArrayList<EmpleadoTO> listEmpleadoJefeTO = new ArrayList<EmpleadoTO>();
				ArrayList<EmpleadoTO> listEmpleadoSubordinadoTO = new ArrayList<EmpleadoTO>();
				int idOperacion = rs.getInt("id_operacion");
				int idResponsable = rs.getInt("id_responsable");
				EmpleadoTO empleadoJefeTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado_jefe"));
				EmpleadoTO empleadoSubordinadoTO = empleadoDAO
						.findEmpleadoById(rs.getInt("id_empleado_subordinado"));
				listEmpleadoJefeTO.add(empleadoJefeTO);
				listEmpleadoSubordinadoTO.add(empleadoSubordinadoTO);
				boolean activo = rs.getBoolean("activo");
				java.sql.Date fecha = rs.getDate("fecha");

				EmpleadoTO[] arrEmpleadoJefeTO = (EmpleadoTO[])listEmpleadoJefeTO.toArray(new EmpleadoTO[listEmpleadoJefeTO.size()]);
				EmpleadoTO[] arrEmpleadoSubordinadoTO = (EmpleadoTO[])listEmpleadoSubordinadoTO.toArray(new EmpleadoTO[listEmpleadoSubordinadoTO.size()]);
				
				bitacoraResponsableTO2 = new BitacoraResponsableTO(idOperacion,
						idResponsable, arrEmpleadoJefeTO,
						arrEmpleadoSubordinadoTO, activo, fecha);

				bitacoraResponsableTO.add(bitacoraResponsableTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraResponsableTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraResponsableTO> selectBitacoraResponsableByIdResponsable(
			int idResponsable) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			EmpleadoDAO empleadoDAO = null;

			ArrayList<BitacoraResponsableTO> bitacoraResponsableTO = null;
			BitacoraResponsableTO bitacoraResponsableTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYIDRESPONSABLE);
			ps.setInt(1, idResponsable);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraResponsableTO == null) {
					bitacoraResponsableTO = new ArrayList<BitacoraResponsableTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				ArrayList<EmpleadoTO> listEmpleadoJefeTO = new ArrayList<EmpleadoTO>();
				ArrayList<EmpleadoTO> listEmpleadoSubordinadoTO = new ArrayList<EmpleadoTO>();
				int idOperacion = rs.getInt("id_operacion");
				idResponsable = rs.getInt("id_responsable");
				EmpleadoTO empleadoJefeTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado_jefe"));
				EmpleadoTO empleadoSubordinadoTO = empleadoDAO
						.findEmpleadoById(rs.getInt("id_empleado_subordinado"));
				listEmpleadoJefeTO.add(empleadoJefeTO);
				listEmpleadoSubordinadoTO.add(empleadoSubordinadoTO);
				boolean activo = rs.getBoolean("activo");
				java.sql.Date fecha = rs.getDate("fecha");

				EmpleadoTO[] arrEmpleadoJefeTO = (EmpleadoTO[])listEmpleadoJefeTO.toArray(new EmpleadoTO[listEmpleadoJefeTO.size()]);
				EmpleadoTO[] arrEmpleadoSubordinadoTO = (EmpleadoTO[])listEmpleadoSubordinadoTO.toArray(new EmpleadoTO[listEmpleadoSubordinadoTO.size()]);
				
				bitacoraResponsableTO2 = new BitacoraResponsableTO(idOperacion,
						idResponsable, arrEmpleadoJefeTO,
						arrEmpleadoSubordinadoTO, activo, fecha);

				bitacoraResponsableTO.add(bitacoraResponsableTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraResponsableTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraResponsableTO selectBitacoraResponsableByJefe(int idJefe) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			EmpleadoDAO empleadoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<Integer> listIdResponsable = null;
			ArrayList<EmpleadoTO> listEmpleadoJefeTO = null;
			ArrayList<EmpleadoTO> listEmpleadoSubordinadoTO = null;
			ArrayList<Boolean> listActivo = null;
			ArrayList<java.sql.Date> listFecha = null;

			BitacoraResponsableTO bitacoraResponsableTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYJEFE);
			ps.setInt(1, idJefe);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdResponsable == null) {

					listIdOperacion = new ArrayList<Integer>();
					listIdResponsable = new ArrayList<Integer>();
					listEmpleadoJefeTO = new ArrayList<EmpleadoTO>();
					listEmpleadoSubordinadoTO = new ArrayList<EmpleadoTO>();
					listActivo = new ArrayList<Boolean>();
					listFecha = new ArrayList<java.sql.Date>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				listIdOperacion.add(rs.getInt("id_operacion"));
				listIdResponsable.add(rs.getInt("id_responsable"));
				listEmpleadoSubordinadoTO.add(empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado_subordinado")));
				listActivo.add(rs.getBoolean("activo"));
				listFecha.add(rs.getDate("fecha"));
			}
			if (listIdOperacion != null) {
				listEmpleadoJefeTO.add(empleadoDAO.findEmpleadoById(idJefe));
				
				EmpleadoTO[] arrEmpleadoJefeTO = (EmpleadoTO[])listEmpleadoJefeTO.toArray(new EmpleadoTO[listEmpleadoJefeTO.size()]);
				EmpleadoTO[] arrEmpleadoSubordinadoTO = (EmpleadoTO[])listEmpleadoSubordinadoTO.toArray(new EmpleadoTO[listEmpleadoSubordinadoTO.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Integer[] arrIdResponsable = (Integer[])listIdResponsable.toArray(new Integer[listIdResponsable.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				bitacoraResponsableTO = new BitacoraResponsableTO(
						arrIdOperacion, arrIdResponsable, arrEmpleadoJefeTO,
						arrEmpleadoSubordinadoTO, arrActivo, arrFecha);
			}
			ps.close();
			conexion.close();
			return bitacoraResponsableTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraResponsableTO> selectBitacoraResponsableByRangoFecha(
			Date inicio, Date fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			EmpleadoDAO empleadoDAO = null;

			ArrayList<BitacoraResponsableTO> bitacoraResponsableTO = null;
			BitacoraResponsableTO bitacoraResponsableTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHA);
			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraResponsableTO == null) {
					bitacoraResponsableTO = new ArrayList<BitacoraResponsableTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				ArrayList<EmpleadoTO> listEmpleadoJefeTO = new ArrayList<EmpleadoTO>();
				ArrayList<EmpleadoTO> listEmpleadoSubordinadoTO = new ArrayList<EmpleadoTO>();
				int idOperacion = rs.getInt("id_operacion");
				int idResponsable = rs.getInt("id_responsable");
				EmpleadoTO empleadoJefeTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado_jefe"));
				EmpleadoTO empleadoSubordinadoTO = empleadoDAO
						.findEmpleadoById(rs.getInt("id_empleado_subordinado"));
				listEmpleadoJefeTO.add(empleadoJefeTO);
				listEmpleadoSubordinadoTO.add(empleadoSubordinadoTO);
				boolean activo = rs.getBoolean("activo");
				java.sql.Date fecha = rs.getDate("fecha");

				EmpleadoTO[] arrEmpleadoJefeTO = (EmpleadoTO[])listEmpleadoJefeTO.toArray(new EmpleadoTO[listEmpleadoJefeTO.size()]);
				EmpleadoTO[] arrEmpleadoSubordinadoTO = (EmpleadoTO[])listEmpleadoSubordinadoTO.toArray(new EmpleadoTO[listEmpleadoSubordinadoTO.size()]);
				
				bitacoraResponsableTO2 = new BitacoraResponsableTO(idOperacion,
						idResponsable, arrEmpleadoJefeTO,
						arrEmpleadoSubordinadoTO, activo, fecha);

				bitacoraResponsableTO.add(bitacoraResponsableTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraResponsableTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraResponsableTO selectBitacoraResponsableBySubordinado(
			int idSubordinado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			EmpleadoDAO empleadoDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<Integer> listIdResponsable = null;
			ArrayList<EmpleadoTO> listEmpleadoJefeTO = null;
			ArrayList<EmpleadoTO> listEmpleadoSubordinadoTO = null;
			ArrayList<Boolean> listActivo = null;
			ArrayList<java.sql.Date> listFecha = null;

			BitacoraResponsableTO bitacoraResponsableTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYSUBORDINADO);
			ps.setInt(1, idSubordinado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdResponsable == null) {

					listIdOperacion = new ArrayList<Integer>();
					listIdResponsable = new ArrayList<Integer>();
					listEmpleadoJefeTO = new ArrayList<EmpleadoTO>();
					listEmpleadoSubordinadoTO = new ArrayList<EmpleadoTO>();
					listActivo = new ArrayList<Boolean>();
					listFecha = new ArrayList<java.sql.Date>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}

				listIdOperacion.add(rs.getInt("id_operacion"));
				listIdResponsable.add(rs.getInt("id_responsable"));
				listEmpleadoJefeTO.add(empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado_jefe")));
				listActivo.add(rs.getBoolean("activo"));
				listFecha.add(rs.getDate("fecha"));
			}
			if (listIdOperacion != null) {
				listEmpleadoSubordinadoTO.add(empleadoDAO.findEmpleadoById(idSubordinado));
				
				EmpleadoTO[] arrEmpleadoJefeTO = (EmpleadoTO[])listEmpleadoJefeTO.toArray(new EmpleadoTO[listEmpleadoJefeTO.size()]);
				EmpleadoTO[] arrEmpleadoSubordinadoTO = (EmpleadoTO[])listEmpleadoSubordinadoTO.toArray(new EmpleadoTO[listEmpleadoSubordinadoTO.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Integer[] arrIdResponsable = (Integer[])listIdResponsable.toArray(new Integer[listIdResponsable.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				
				bitacoraResponsableTO = new BitacoraResponsableTO(
						arrIdOperacion, arrIdResponsable, arrEmpleadoJefeTO,
						arrEmpleadoSubordinadoTO, arrActivo, arrFecha);
			}
			ps.close();
			conexion.close();
			return bitacoraResponsableTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
